
/**
 * this -> JavaScript 关键字
 * 当前环境执行期上下文对象的一个属性
 * this在不同的环境、不同的作用下，表现是不同的
 */


// 全局作用域下的this -> 全局对象
// window 和 this 的关系

// console.log(this === window) // true

// var a = 1;
// var b = function () { return 'function' };
// console.log(window.a === a); // true
// console.log(window.b === b); // true

// window.aa = 1;
// window.bb = function () { return 'function' };
// console.log(window.aa === aa); // true
// console.log(window.bb === bb); // true
// console.log(this.bb === bb); // true


// this -> 在不同环境下 浏览器(web) node worker
/**
 * 获取全局对象
 * web: window / self / frames / this(全局下)
 * node: global
 * worker: self
 * 
 * 通用: globalThis
 */

// var a = 'global -> a';
// global.b = 'global -> b'; // node 环境下
// var obj = {
//   a: 'obj -> a',
//   test: function () {
    // console.log(this.a); // obj -> a
    // console.log(self.a); // global -> a
    // console.log(frames.a); // global -> a
    // console.log(window.a); // global -> a 
    // console.log(globalThis.a); // global -> a
    
    // console.log(global.a); // undefined
    // console.log(global.b); // global -> b
//   }
// }
// obj.test()
// console.log(globalThis)


function test() {
  'use strict'
  // 严格模式、模块环境下this 在函数内部 为 undefined 
  return this // window
}
// window.test = function () {
//   return this
// }
console.log(test())
// 谁调用函数，函数内部的指向，默认就是谁
console.log(window.test()) // window
